/**
 * 优化后的研发项目数据模型
 * 采用小驼峰命名规则，按逻辑分组组织字段
 */

const { PROJECT_SCHEMA } = require('../../../constants/project_schema.js');

class ResearchProjectModel {

	/**
	 * 获取数据库表结构
	 */
	static DB_STRUCTURE = PROJECT_SCHEMA;

	/**
	 * 项目状态定义
	 */
	static STATUS = {
		DRAFT: 0,         // 草稿
		APPROVAL: 1,      // 审批中
		ACTIVE: 2,        // 执行中
		COMPLETED: 3,     // 已完成
		REJECTED: 4,      // 已拒绝
		CANCELED: 5,      // 已取消
		PAUSED: 6         // 已暂停
	};

	/**
	 * 项目子状态定义
	 */
	static SUB_STATUS = {
		// 审批子状态
		DIRECTOR: 'director',     // 董事长审批
		MANAGER: 'manager',       // 经理审批
		LEADER: 'leader',         // 组长审批
		APPROVE_COMPLETED: 'approved', // 审批通过
		
		// 执行子状态
		PLANNING: 'planning',      // 规划阶段
		DESIGN: 'design',          // 设计阶段
		DEVELOPMENT: 'development', // 开发阶段
		TESTING: 'testing',        // 测试阶段
		VALIDATION: 'validation'   // 验证阶段
	};

	/**
	 * 项目活动状态定义
	 */
	static ACTIVE_STATUS = {
		// 设计阶段活动
		SCHEMATIC: 'schematic',    // 原理图设计 
		PCB: 'pcb',                // PCB设计
		BOM: 'bom',                // BOM清单编制
		
		// 开发阶段活动
		FIRMWARE: 'firmware',      // 固件开发
		SOFTWARE: 'software',      // 软件开发
		TUNING: 'tuning',          // 调试
		
		// 测试阶段活动
		FUNCTION_TEST: 'functionTest',  // 功能测试
		SAFETY_TEST: 'safetyTest',      // 安全测试
		EMC_TEST: 'emcTest',            // EMC测试
		ENDURANCE_TEST: 'enduranceTest' // 耐久测试
	};

	/**
	 * 项目类型定义
	 */
	static PROJECT_TYPES = {
		MOTOR_CONTROL: '电机控制类',  // 电机控制类
		MAGNETIC_ENCODER: '磁编',    // 磁编
		HALL: '霍尔',                // 霍尔
		FAN: '风机',                 // 风机
		PUMP: '水泵',                // 水泵
		POWER_SUPPLY: '电源类',      // 电源类
		SENSOR: '传感器类',          // 传感器类
		OTHER: '其他类型'            // 其他类型
	};

	/**
	 * 项目类型名称映射
	 */
	static PROJECT_TYPE_NAMES = {
		'电机控制类': '电机控制类',
		'磁编': '电机控制类',
		'霍尔': '电机控制类',
		'风机': '电机控制类',
		'水泵': '电机控制类',
		'电源类': '电源类',
		'传感器类': '传感器类',
		'其他类型': '其他类型'
	};

	/**
	 * 一级状态定义
	 */
	static LEVEL_1 = {
		APPROVAL: 1,      // 项目审核
		DORMANT: 2,       // 休眠状态
		ACTIVE: 3,        // 活动状态
		PAUSED: 4,        // 暂停状态
		POSTPONED: 5,     // 延期状态
		ON_HOLD: 6,       // 搁置状态
		COMPLETED: 99     // 已完成
	};

	/**
	 * 一级状态名称
	 */
	static LEVEL_1_NAMES = {
		1: '项目审核',
		2: '休眠状态',
		3: '活动状态',
		4: '暂停状态',
		5: '延期状态',
		6: '搁置状态',
		99: '已完成'
	};

	/**
	 * 二级状态定义
	 */
	static LEVEL_2 = {
		// 审批状态
		DIRECTOR: 'director',             // 董事长审批
		MANAGER: 'manager',              // 经理审批
		LEADER: 'leader',                // 组长审批
		
		// 休眠状态
		PENDING_RESOURCES: 'pending_resources',  // 等待资源
		PENDING_PLANNING: 'pending_planning',    // 等待规划
		PENDING_APPROVAL: 'pending_approval',    // 等待批准
		
		// 活动状态
		PLANNING: 'planning',             // 规划阶段
		DESIGN: 'design',                 // 设计阶段
		DEVELOPMENT: 'development',       // 开发阶段
		TESTING: 'testing',               // 测试阶段
		VALIDATION: 'validation'          // 验证阶段
	};

	/**
	 * 二级状态名称
	 */
	static LEVEL_2_NAMES = {
		'director': '董事长',
		'manager': '经理',
		'leader': '组长',
		
		'pending_resources': '等待资源',
		'pending_planning': '等待规划',
		'pending_approval': '等待批准',
		
		'planning': '规划阶段',
		'design': '设计阶段',
		'development': '开发阶段',
		'testing': '测试阶段',
		'validation': '验证阶段'
	};

	/**
	 * 三级状态定义
	 */
	static LEVEL_3 = {
		// 设计阶段
		REQUIREMENT_ANALYSIS: 'requirement_analysis',  // 需求分析
		SCHEMATIC_DESIGN: 'schematic_design',         // 原理图设计
		PCB_DESIGN: 'pcb_design',                     // PCB设计
		BOM_CREATION: 'bom_creation',                // BOM清单生成
		DESIGN_REVIEW: 'design_review',              // 设计评审
		DESIGN_COMPLETED: 'design_completed',        // 设计完成
		
		// 开发阶段
		HARDWARE_DEVELOPMENT: 'hardware_development',  // 硬件开发
		FIRMWARE_DEVELOPMENT: 'firmware_development',  // 固件开发
		SOFTWARE_DEVELOPMENT: 'software_development',  // 软件开发
		PROTOTYPE_BUILDING: 'prototype_building',     // 样机制作
		DEBUG: 'debug',                              // 调试
		DEVELOPMENT_REVIEW: 'development_review',    // 开发评审
		DEVELOPMENT_COMPLETED: 'development_completed', // 开发完成
		
		// 测试阶段
		TEST_PLANNING: 'test_planning',              // 测试计划
		FUNCTIONAL_TESTING: 'functional_testing',    // 功能测试
		PERFORMANCE_TESTING: 'performance_testing',  // 性能测试
		RELIABILITY_TESTING: 'reliability_testing',  // 可靠性测试
		EMC_TESTING: 'emc_testing',                  // EMC测试
		SAFETY_TESTING: 'safety_testing',            // 安全测试
		CERTIFICATION_TESTING: 'certification_testing', // 认证测试
		FIELD_TESTING: 'field_testing',              // 现场测试
		TEST_REPORT: 'test_report',                  // 测试报告
		TEST_REVIEW: 'test_review',                  // 测试评审
		TEST_COMPLETED: 'test_completed',            // 测试完成
		
		// 验证阶段
		VERIFICATION_PLANNING: 'verification_planning',  // 验证计划
		SMALL_BATCH_PRODUCTION: 'small_batch_production', // 小批量生产
		QUALITY_VERIFICATION: 'quality_verification',    // 质量验证
		PROCESS_VERIFICATION: 'process_verification',    // 工艺验证
		CUSTOMER_VERIFICATION: 'customer_verification',  // 客户验证
		VERIFICATION_REPORT: 'verification_report',      // 验证报告
		VERIFICATION_REVIEW: 'verification_review',      // 验证评审
		VERIFICATION_COMPLETED: 'verification_completed' // 验证完成
	};

	/**
	 * 三级状态名称
	 */
	static LEVEL_3_NAMES = {
		// 设计阶段
		'requirement_analysis': '需求分析',
		'schematic_design': '原理图设计',
		'pcb_design': 'PCB设计', 
		'bom_creation': 'BOM清单生成',
		'design_review': '设计评审', 
		'design_completed': '设计完成',
		
		// 开发阶段
		'hardware_development': '硬件开发',
		'firmware_development': '固件开发',
		'software_development': '软件开发',
		'prototype_building': '样机制作',
		'debug': '调试',
		'development_review': '开发评审',
		'development_completed': '开发完成',
		
		// 测试阶段
		'test_planning': '测试计划',
		'functional_testing': '功能测试',
		'performance_testing': '性能测试',
		'reliability_testing': '可靠性测试',
		'emc_testing': 'EMC测试',
		'safety_testing': '安全测试',
		'certification_testing': '认证测试',
		'field_testing': '现场测试',
		'test_report': '测试报告',
		'test_review': '测试评审',
		'test_completed': '测试完成',
		
		// 验证阶段
		'verification_planning': '验证计划',
		'small_batch_production': '小批量生产',
		'quality_verification': '质量验证',
		'process_verification': '工艺验证',
		'customer_verification': '客户验证',
		'verification_report': '验证报告',
		'verification_review': '验证评审',
		'verification_completed': '验证完成'
	};

	/**
	 * 状态转换规则
	 * 定义从一个状态转换到另一个状态的合法路径
	 */
	static STATE_TRANSITIONS = {
		// 项目审核状态下的转换
		1: {
			'director': {
				// 董事长审批后的下一个状态
				'next': { level1: 1, level2: 'manager' },
				'reject': { level1: 6, level2: 'pending_approval' }
			},
			'manager': {
				// 经理审批后的下一个状态
				'next': { level1: 1, level2: 'leader' },
				'reject': { level1: 1, level2: 'director' },
				'back': { level1: 1, level2: 'director' }
			},
			'leader': {
				// 组长审批后的下一个状态
				'next': { level1: 3, level2: 'planning' },
				'reject': { level1: 1, level2: 'manager' },
				'back': { level1: 1, level2: 'manager' }
			}
		},
		
		// 休眠状态下的转换
		2: {
			'pending_resources': {
				// 资源到位
				'next': { level1: 3, level2: 'planning' },
				'cancel': { level1: 6, level2: 'pending_approval' }
			},
			'pending_planning': {
				// 规划完成
				'next': { level1: 3, level2: 'planning' },
				'cancel': { level1: 6, level2: 'pending_approval' }
			},
			'pending_approval': {
				// 批准通过
				'next': { level1: 3, level2: 'planning' },
				'reject': { level1: 99, level2: '' }
			}
		},
		
		// 活动状态下的转换
		3: {
			'planning': {
				// 规划阶段结束 -> 进入设计阶段
				'next': { level1: 3, level2: 'design' },
				'pause': { level1: 4, level2: 'planning' },
				'hold': { level1: 6, level2: 'pending_resources' }
			},
			'design': {
				// 设计阶段结束 -> 进入开发阶段
				'next': { level1: 3, level2: 'development' },
				'back': { level1: 3, level2: 'planning' },
				'pause': { level1: 4, level2: 'design' },
				'hold': { level1: 6, level2: 'pending_resources' }
			},
			'development': {
				// 开发阶段结束 -> 进入测试阶段
				'next': { level1: 3, level2: 'testing' },
				'back': { level1: 3, level2: 'design' },
				'pause': { level1: 4, level2: 'development' },
				'hold': { level1: 6, level2: 'pending_resources' }
			},
			'testing': {
				// 测试阶段结束 -> 进入验证阶段
				'next': { level1: 3, level2: 'validation' },
				'back': { level1: 3, level2: 'development' },
				'pause': { level1: 4, level2: 'testing' },
				'hold': { level1: 6, level2: 'pending_resources' }
			},
			'validation': {
				// 验证阶段结束 -> 项目完成
				'next': { level1: 99, level2: '' },
				'back': { level1: 3, level2: 'testing' },
				'pause': { level1: 4, level2: 'validation' },
				'hold': { level1: 6, level2: 'pending_resources' }
			}
		},
		
		// 暂停状态下的转换
		4: {
			'planning': {
				// 恢复规划阶段
				'resume': { level1: 3, level2: 'planning' },
				'cancel': { level1: 99, level2: '' }
			},
			'design': {
				// 恢复设计阶段
				'resume': { level1: 3, level2: 'design' },
				'cancel': { level1: 99, level2: '' }
			},
			'development': {
				// 恢复开发阶段
				'resume': { level1: 3, level2: 'development' },
				'cancel': { level1: 99, level2: '' }
			},
			'testing': {
				// 恢复测试阶段
				'resume': { level1: 3, level2: 'testing' },
				'cancel': { level1: 99, level2: '' }
			},
			'validation': {
				// 恢复验证阶段
				'resume': { level1: 3, level2: 'validation' },
				'cancel': { level1: 99, level2: '' }
			}
		}
	};

	/**
	 * 获取状态描述
	 * @param {Number} level1 一级状态
	 * @param {String} level2 二级状态
	 * @param {String} level3 三级状态
	 * @param {String} level4 四级状态
	 * @returns {String} 状态描述
	 */
	static getStatusDesc(level1, level2 = '', level3 = '', level4 = '') {
		// 一级状态名称
		const level1Name = this.LEVEL_1_NAMES[level1] || '未知状态';
		
		// 二级状态名称
		let level2Name = '';
		if (level2 && this.LEVEL_2_NAMES[level2]) {
			level2Name = this.LEVEL_2_NAMES[level2];
		}
		
		// 三级状态名称
		let level3Name = '';
		if (level3 && this.LEVEL_3_NAMES[level3]) {
			level3Name = this.LEVEL_3_NAMES[level3];
		}
		
		// 构建状态描述
		let statusDesc = level1Name;
		if (level2Name) {
			statusDesc += ' > ' + level2Name;
		}
		if (level3Name) {
			statusDesc += ' > ' + level3Name;
		}
		if (level4) {
			statusDesc += ' > ' + level4;
		}
		
		return statusDesc;
	}
	
	/**
	 * 获取项目类型名称
	 * @param {String} type 项目类型
	 * @returns {String} 项目类型名称
	 */
	static getProjectTypeName(type) {
		return this.PROJECT_TYPE_NAMES[type] || type;
	}

	/**
	 * 确保只保存model字段，删除projectTitle相关代码
	 */
	static async validateAndPreprocess(data) {
		// 确保必要字段存在
		if (!data.model) {
			if (data.projectTitle) {
				// 如果有projectTitle但没有model，转换为model
				data.model = data.projectTitle;
				// 删除projectTitle字段
				delete data.projectTitle;
			} else if (data.PROJECT_TITLE) {
				// 如果有PROJECT_TITLE但没有model，转换为model
				data.model = data.PROJECT_TITLE;
				// 删除PROJECT_TITLE字段
				delete data.PROJECT_TITLE;
			} else if (data.name) {
				// 如果有name但没有model，转换为model
				data.model = data.name;
			} else {
				data.model = '未命名项目';
			}
		}
		
		// 删除projectTitle字段，统一使用model
		if (data.projectTitle) {
			delete data.projectTitle;
		}
		
		// 删除PROJECT_TITLE字段，统一使用model
		if (data.PROJECT_TITLE) {
			delete data.PROJECT_TITLE;
		}
		
		// 删除id字段，统一使用_id
		if (data.id) {
			delete data.id;
		}
		
		return data;
	}
}

module.exports = ResearchProjectModel; 